/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * EcranFond.java
 *
 * Created on 8 avr. 2010, 08:30:22
 */

package vue;

import controleur.CCLogger;
import modele.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.Vector;
import vue.composants.ImageMiniature;
import vue.composants.ListeCouleur;
import vue.composants.ListeCouleurEcouteur;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.logging.Level;
import main.Outils;


/**
 * Représente l'écran de fond de l'application.
 * @author Synapse
 */
public class EcranFond extends Ecran implements ListeCouleurEcouteur, MouseListener {

    // Vecteur pour les couleurs
    private Vector<Color> lstCouleur = new Vector<Color>();

    // Vecteur pour les images de fonds
    private Vector<ImageMiniature> miniatures = new Vector<ImageMiniature>();
    
    // Liste déroulante des couleurs
    private ListeCouleur cmbCouleur = new ListeCouleur(ressources, this,150,20);

    // Variable pour enregistrer la couleur
    private Color couleurChoisie;

    // Variable pour enregistrer l'image
    private Image imageChoisie;

    // Pour définir le choix; false=couleur;true=image
    private boolean choixEstImage = false; 


    /**
     * Constructeur de la class EcranFond.
     * Initialise un objet de type EcranFond et requière un objet de type FenetreMere.
     * Pas de retour.
     * @param   mere    une instance de la classe FenetreMere
     * @see FenetreMere
     */
    public EcranFond(FenetreMere mere) {
        super(mere);
        initComponents();
        try{
            this.initListeCouleur();
            this.afficheImagesDeFond();
            this.repaint();
        }
        catch (Exception ex) {
            CCLogger.Write(Level.SEVERE, Outils.getStackTrace(ex));
            this.afficherMessageErreur("Erreur lors de l'initialistion de l'écran Fond.");
        }
    }

    /**
     * Initialise la liste déroulante des couleurs.
     * Utilise un objet de type ListeCouleur.
     * Pas de paramètres.
     * Pas de retour.
     * @see ListeCouleur
     */
    private void initListeCouleur(){
        //On crée la combobox de la couleur
        cmbCouleur.setSize(222,30);
        cmbCouleur.setLocation(13, 42);
        cmbCouleur.setVisible(true);
        //On initialise la couleur coisie à la valeur de la combobox
        couleurChoisie = cmbCouleur.getCouleurCourante();
        //On met le bouton suivant disponible
        this.btnSuivant.setEnabled(true);
        panFonds.add(cmbCouleur);
    }

    /**
     * Permet de savoir si l'on a choisi une image comme fond d'écran.
     * Pas de paramètres.
     * @return  un type boolean; true si le choix est une image, false si le choix est une couleur.
     */
    public boolean isChoixEstImage() {
        return choixEstImage;
    }

    /**
     * Getter pour l'attribut couleurChoisie.
     * Pas de paramètres.
     * @return  type Color
     * @see Color
     */
    public Color getCouleurChoisie() {
        return couleurChoisie;
    }

     /**
     * Getter pour l'attribut imageChoisie.
     * Pas de paramètres.
     * @return un type Image
     * @see Image
     */
    public Image getImageChoisie() {
        return imageChoisie;
    }

    /**
     * Permet de placer le choix de l'utilisateur sur la couleur.
     * Pas de retour.
     * @param couleurChoisie de type Color.
     */
    public void couleurChangee(Color couleurChoisie) {
        // On place le choix sur la couleur
        this.choixEstImage = false;
        cmbCouleur.setSelectionne(true);
        // On enregistre la couleur choisie
        this.couleurChoisie = couleurChoisie;
        for(int j=0; j < miniatures.size(); j++){
            miniatures.get(j).setSelectionne( false );
         }
             panImagesDeFond.repaint();

        // DEBUG
        //System.out.println(couleurChoisie.toString());
    }

    /**
     * Permet d'afficher les images de fond
     * Pas de paramètres.
     * Pas de retour.
     */
    private void afficheImagesDeFond(){

        Dimension dim = new Dimension(402, 300);
        Vector<Image> fonds = ressources.getImagesDeFond();
        GridLayout grillePositionnement = new GridLayout((fonds.size()/2)+(fonds.size()%2), 2, 0, 0);
        grillePositionnement.setHgap(10);
        grillePositionnement.setVgap(10);
        panImagesDeFond.setLayout( grillePositionnement );
        for (Image image : fonds) {

            // Création d'une miniature
            ImageMiniature miniature = new ImageMiniature(image, dim, this);
            miniatures.add( miniature );

            // Ajout à la liste
            panImagesDeFond.add( miniatures.lastElement() );
        }
        
    }

    /**
     * Ecouteur pour l'événement "pression de la souris".
     * Pas d'action associée.
     * @param e type MouseEvent
     * @see MouseListener
     */
    public void mousePressed(MouseEvent e) { }

    /**
     * Ecouteur pour l'événement "relachement de la souris".
     * On va placer un filtre sur l'image de fond choisi et place le choix sur l'image de fond
     * @param e type MouseEvent
     * @see MouseListener
     */
    public void mouseReleased(MouseEvent e) {
            // On cherche l'index de l'image qui a envoyé l'évennement
        for(int i=0; i < miniatures.size(); i++) {
 
            ImageMiniature min = miniatures.get(i);

            // Si l'origine de l'évennement est l'image courante
            if( min == e.getSource() ) {

                // On enregistre le modele concerné
                imageChoisie = min.getImage();

                // On met à jour l'affichage
                for(int j=0; j < miniatures.size(); j++){
                    if(i==j){
                    // On place le choix sur l'image
                        this.choixEstImage = true;
                    // La liste déroulante n'est plus active
                        cmbCouleur.setSelectionne(false);
                    // Si selectionné, on ajoute une couche opaque
                        miniatures.get(j).setSelectionne( i==j );
                    // On enregistre l'image choisie
                        imageChoisie = miniatures.get(j).getImage();
                    }
                    else
                    {
                        miniatures.get(j).setSelectionne( false );
                    }
             panImagesDeFond.repaint();
            }
        }

        }
    }

    /**
     * Ecouteur pour l'événement "souris entrante".
     * Pas d'action associée.
     * @param e type MouseEvent
     * @see MouseListener
     */
    public void mouseEntered(MouseEvent e) {  }

    /**
     * Ecouteur pour l'événement "souris sortante".
     * Pas d'action associée.
     * @param e type MouseEvent
     * @see MouseListener
     */
    public void mouseExited(MouseEvent e) {  }

    /**
     * Ecouteur pour l'événement "click de la souris".
     * Pas d'action associée.
     * @param e type MouseEvent
     * @see MouseListener
     */
    public void mouseClicked(MouseEvent e) {


    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnPrecedent = new javax.swing.JButton();
        btnRecommencer = new javax.swing.JButton();
        btnSuivant = new javax.swing.JButton();
        labBandeau = new javax.swing.JLabel();
        labIndication = new javax.swing.JLabel();
        panFonds = new javax.swing.JPanel();
        labCouleur = new javax.swing.JLabel();
        labFond = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        panImagesDeFond = new javax.swing.JPanel();

        setBackground(new java.awt.Color(255, 255, 255));
        setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 255), 2));
        setMaximumSize(new java.awt.Dimension(1024, 768));
        setPreferredSize(new java.awt.Dimension(1024, 768));

        btnPrecedent.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnPrecedent.setText("< Précédent");
        btnPrecedent.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPrecedentActionPerformed(evt);
            }
        });

        btnRecommencer.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnRecommencer.setText("Recommencer");
        btnRecommencer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRecommencerActionPerformed(evt);
            }
        });

        btnSuivant.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnSuivant.setText("Suivant >");
        btnSuivant.setEnabled(false);
        btnSuivant.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSuivantActionPerformed(evt);
            }
        });

        labBandeau.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vue/images/choixfond.png"))); // NOI18N
        labBandeau.setMaximumSize(new java.awt.Dimension(1024, 88));
        labBandeau.setMinimumSize(new java.awt.Dimension(1024, 88));
        labBandeau.setPreferredSize(new java.awt.Dimension(1024, 88));

        labIndication.setFont(new java.awt.Font("Tahoma", 0, 18));
        labIndication.setText("Choisissez le fond d'écran ou la couleur de votre carte postale:");

        panFonds.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 255)));
        panFonds.setPreferredSize(new java.awt.Dimension(1000, 551));

        labCouleur.setFont(new java.awt.Font("Tahoma", 0, 18));
        labCouleur.setText("Couleur:");

        labFond.setFont(new java.awt.Font("Tahoma", 0, 18));
        labFond.setText("Fond d'écran:");

        javax.swing.GroupLayout panImagesDeFondLayout = new javax.swing.GroupLayout(panImagesDeFond);
        panImagesDeFond.setLayout(panImagesDeFondLayout);
        panImagesDeFondLayout.setHorizontalGroup(
            panImagesDeFondLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 974, Short.MAX_VALUE)
        );
        panImagesDeFondLayout.setVerticalGroup(
            panImagesDeFondLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 406, Short.MAX_VALUE)
        );

        jScrollPane1.setViewportView(panImagesDeFond);

        javax.swing.GroupLayout panFondsLayout = new javax.swing.GroupLayout(panFonds);
        panFonds.setLayout(panFondsLayout);
        panFondsLayout.setHorizontalGroup(
            panFondsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panFondsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panFondsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panFondsLayout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 974, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(panFondsLayout.createSequentialGroup()
                        .addGroup(panFondsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(labCouleur)
                            .addComponent(labFond, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE))
                        .addGap(453, 453, 453))))
        );
        panFondsLayout.setVerticalGroup(
            panFondsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panFondsLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(labCouleur)
                .addGap(66, 66, 66)
                .addComponent(labFond)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 395, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(labBandeau, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btnPrecedent, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(197, 197, 197)
                .addComponent(btnRecommencer, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 203, Short.MAX_VALUE)
                .addComponent(btnSuivant, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(labIndication)
                .addGap(509, 509, 509))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panFonds, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(labBandeau, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(labIndication)
                .addGap(18, 18, 18)
                .addComponent(panFonds, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnSuivant, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnPrecedent, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnRecommencer, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Ecouteur pour le bouton "Précédent".
     * Indique au controleur que l'utilisateur souhaite revenir sur l'écran précédent
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnPrecedentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPrecedentActionPerformed
        controleur.trFondPrecedent();
}//GEN-LAST:event_btnPrecedentActionPerformed

    /**
     * Ecouteur pour le bouton "Recommencer".
     * Indique au controleur que l'utilisateur souhaite recommencer
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnRecommencerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRecommencerActionPerformed
        this.trClicSurRecommencer();
}//GEN-LAST:event_btnRecommencerActionPerformed

     /**
     * Ecouteur pour le bouton "Suivant".
     * Indique au controleur que l'utilisateur souhaite revenir sur l'écran suivant
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnSuivantActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSuivantActionPerformed
        if(this.choixEstImage){
            // C'est l'image de fond qui est choisie, on place la couleur choisi a null
            this.couleurChoisie = null;
        }
        else{
            // C'est la couleur de fond qui est choisie, on place l'image choisi a null
            this.imageChoisie = null;
        }
        controleur.trFondSuivant();
}//GEN-LAST:event_btnSuivantActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnPrecedent;
    private javax.swing.JButton btnRecommencer;
    private javax.swing.JButton btnSuivant;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel labBandeau;
    private javax.swing.JLabel labCouleur;
    private javax.swing.JLabel labFond;
    private javax.swing.JLabel labIndication;
    private javax.swing.JPanel panFonds;
    private javax.swing.JPanel panImagesDeFond;
    // End of variables declaration//GEN-END:variables

}
